package com.finance.cooperate.dao.support.query;

import lombok.NoArgsConstructor;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

import java.io.Serializable;

/**
 * 类名称 : Order
 * 功能描述 :排序
 * 创建时间 : 2018/11/14 15:17
 * 创建人： 沈安心
 * 修改人 修改日期 修改描述：
 * -----------------------------------
 */
@NoArgsConstructor
public class Order implements Serializable {

    private static final long serialVersionUID = -3078342809727773232L;
    //默认方向
    private static final Direction DEFAULT_DIRECTION = Direction.asc;
    //属性
    private String property;
    //方向
    private Direction direction = DEFAULT_DIRECTION;

    /*
     * 创建人：沈安心
     * 功能描述：构造方法
     * 创建时间：2018/11/14 17:09
     * 入参：[property 属性, direction 方向]
     * 返回值：
     */
    public Order(String property, Direction direction) {
        this.property = property;
        this.direction = direction;
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回递增排序
     * 创建时间：2018/11/14 17:09
     * 入参：[property 属性]
     * 返回值：com.mq.common.support.jpa.specification.Order 递增排序
     */
    public static Order asc(String property) {
        return new Order(property, Direction.asc);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回递减排序
     * 创建时间：2018/11/14 17:10
     * 入参：[property 属性]
     * 返回值：com.mq.common.support.jpa.specification.Order 递减排序
     */
    public static Order desc(String property) {
        return new Order(property, Direction.desc);
    }

    /*
     * 创建人：沈安心
     * 功能描述：获取属性
     * 创建时间：2018/11/14 17:10
     * 入参：[]
     * 返回值：java.lang.String 属性
     */
    public String getProperty() {
        return property;
    }

    /*
     * 创建人：沈安心
     * 功能描述：设置属性
     * 创建时间：2018/11/14 17:10
     * 入参：[property 属性]
     * 返回值：void
     */
    public void setProperty(String property) {
        this.property = property;
    }

    /*
     * 创建人：沈安心
     * 功能描述：获取方向
     * 创建时间：2018/11/14 17:11
     * 入参：[]
     * 返回值：com.mq.common.support.jpa.specification.Direction 方向
     */
    public Direction getDirection() {
        return direction;
    }

    /*
     * 创建人：沈安心
     * 功能描述：设置方向
     * 创建时间：2018/11/14 17:11
     * 入参：[direction 方向]
     * 返回值：void
     */
    public void setDirection(Direction direction) {
        this.direction = direction;
    }

    /*
     * 创建人：沈安心
     * 功能描述：重写equals方法
     * 创建时间：2018/11/14 17:11
     * 入参：[obj 对象]
     * 返回值：boolean 是否相等
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        Order other = (Order) obj;
        return new EqualsBuilder().append(getProperty(), other.getProperty()).append(getDirection(), other.getDirection()).isEquals();
    }

    /*
     * 创建人：沈安心
     * 功能描述：重写hashCode方法
     * 创建时间：2018/11/14 17:12
     * 入参：[]
     * 返回值：int
     */
    @Override
    public int hashCode() {
        return new HashCodeBuilder(17, 37).append(getProperty()).append(getDirection()).toHashCode();
    }

    @Override
    public String toString() {
        return property + " " + direction.name();
    }
}